import tkinter as tk

# 原始数据
A = {
    "B": {"b1": 3, "b2": 9, "b3": 8},
    "C": {"c1": 1, "c2": 4, "c3": 6},
    "D": {"d1": 7, "d2": 2, "d3": 5}
}

# 转数组，方便计算
data = []
keys = list(A.keys())
for key in keys:
    data.append(list(A[key].values()))

# 极大极小算法
max_value = float('-inf')  # 默认无穷小
O = 0
for i in range(len(data)):
    # 取出所有数组元素然后找出最小值
    min_value = float('inf')  # 默认无穷大
    for j in range(len(data[i])):
        num = data[i][j]
        O += 1  # 累计计算次数
        if num < min_value:
            # 返回当前节点中的最小值
            min_value = num
    # 返回当前节点中的最大值
    if min_value > max_value:
        max_value = min_value

# 采用剪枝搜索的极大极小算法
max2 = None  # 除了默认无穷小之外也可以默认为 None
O2 = 0
for i in range(len(data)):
    min_value = float('inf')
    for j in range(len(data[i])):
        # 如果还有子节点就需要继续遍历，此处假设是叶节点
        num = data[i][j]
        if max2 is not None and num < max2:
            # 跳出循环(剪枝)，不再计算
            break
        else:
            if num < min_value:
                # 选定一个最小值
                min_value = num
                if max2 is None:
                    max2 = min_value  # 初始化最大值
            O2 += 1

# 计算效率
n = ((O - O2) / O * 100)

# 创建主窗口
root = tk.Tk()
root.title("A - B 剪枝搜索")

# 创建标签
label_title = tk.Label(root, text="剪枝搜索", font=("Helvetica", 16))
label_title.pack(pady=10)

# 显示结果的文本框
text_result = tk.Text(root, height=10, width=60)
text_result.pack(pady=10)

# 插入结果信息
result_text = f"在决策树：{A} 中，\n"
result_text += f"我方应该选择胜率为 {max2} 的点\n"
result_text += f"剪枝算法比传统算法少了约 {n:.2f}% 的运算量"
text_result.insert(tk.END, result_text)

# 运行主循环
root.mainloop()